001 /* 002 * Copyright 2006 Stephen J. McConnell. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 013 * implied. 014 * 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 019 package net.dpml.lang; 020 021 import java.net.URI; 022 import java.util.Arrays; 023 024 /** 025 * A Plugin class contains immutable data about a plugin based on a descriptor resolved 026 * from a 'plugin' artifact. 027 * 028 * @author <a href="http://www.dpml.net">Digital Product Meta Library</a> 029 * @version 1.0.1 030 */ 031 public final class Classpath extends AbstractDirective 032 { 033 private static final URI[] EMPTY = new URI[0]; 034 035 private final URI[] m_system; 036 private final URI[] m_public; 037 private final URI[] m_protected; 038 private final URI[] m_private; 039 private final Classpath m_base; 040 041 /** 042 * Creation of a empty classpath definition. 043 */ 044 public Classpath() 045 { 046 this( EMPTY, EMPTY, EMPTY, EMPTY ); 047 } 048 049 /** 050 * Creation of a new classpath definition. 051 * @param base the base classpath from which this classpath is derived 052 * @param extension the extended classpath definition 053 */ 054 public Classpath( final Classpath base, final Classpath extension ) 055 { 056 if( null == extension ) 057 { 058 throw new NullPointerException( "extension" ); 059 } 060 m_base = base; 061 m_system = extension.m_system; 062 m_public = extension.m_public; 063 m_protected = extension.m_protected; 064 m_private = extension.m_private; 065 } 066 067 /** 068 * Creation of a new classpath definition. 069 * @param systemUris an array of uris representing the system classpath extensions 070 * @param publicUris an array of uris representing the public classpath entries 071 * @param protectedUris an array of uris representing protected classpath entries 072 * @param privateUris an array of uris representing private classpath entries 073 */ 074 public Classpath( 075 URI[] systemUris, URI[] publicUris, URI[] protectedUris, URI[] privateUris ) 076 { 077 this( null, systemUris, publicUris, protectedUris, privateUris ); 078 } 079 080 /** 081 * Creation of a new classpath definition. 082 * @param base super classpath (may be null) 083 * @param systemUris an array of uris representing the system classpath extensions 084 * @param publicUris an array of uris representing the public classpath entries 085 * @param protectedUris an array of uris representing protected classpath entries 086 * @param privateUris an array of uris representing private classpath entries 087 */ 088 public Classpath( 089 Classpath base, URI[] systemUris, URI[] publicUris, URI[] protectedUris, URI[] privateUris ) 090 { 091 m_base = base; 092 if( null == systemUris ) 093 { 094 m_system = EMPTY_URIS; 095 } 096 else 097 { 098 m_system = systemUris; 099 } 100 101 if( null == publicUris ) 102 { 103 m_public = EMPTY_URIS; 104 } 105 else 106 { 107 m_public = publicUris; 108 } 109 110 if( null == protectedUris ) 111 { 112 m_protected = EMPTY_URIS; 113 } 114 else 115 { 116 m_protected = protectedUris; 117 } 118 119 if( null == privateUris ) 120 { 121 m_private = EMPTY_URIS; 122 } 123 else 124 { 125 m_private = privateUris; 126 } 127 } 128 129 /** 130 * Return the base classpath. 131 * @return the base classpath that this classpath extends (possibly null) 132 */ 133 public Classpath getBaseClasspath() 134 { 135 return m_base; 136 } 137 138 /** 139 * Return the classloader dependencies relative to a supplied classloader category. 140 * 141 * @param category the classloader category 142 * @return an array of uris defining the classloader classpath for the supplied category 143 */ 144 public URI[] getDependencies( final Category category ) 145 { 146 if( Category.SYSTEM.equals( category ) ) 147 { 148 return m_system; 149 } 150 else if( Category.PUBLIC.equals( category ) ) 151 { 152 return m_public; 153 } 154 else if( Category.PROTECTED.equals( category ) ) 155 { 156 return m_protected; 157 } 158 else if( Category.PRIVATE.equals( category ) ) 159 { 160 return m_private; 161 } 162 else 163 { 164 final String error = 165 "Category not recognized." 166 + "\nCategory: " + category; 167 throw new IllegalArgumentException( error ); 168 } 169 } 170 171 /** 172 * Compare this object with another for equality. 173 * @param other the other object 174 * @return TRUE if equal else FALSE 175 */ 176 public boolean equals( Object other ) 177 { 178 if( other instanceof Classpath ) 179 { 180 Classpath classpath = (Classpath) other; 181 //if( equals( m_base, classpath.m_base ) ) 182 //{ 183 // return false; 184 //} 185 if( !Arrays.equals( m_system, classpath.getDependencies( Category.SYSTEM ) ) ) 186 { 187 return false; 188 } 189 if( !Arrays.equals( m_public, classpath.getDependencies( Category.PUBLIC ) ) ) 190 { 191 return false; 192 } 193 if( !Arrays.equals( m_protected, classpath.getDependencies( Category.PROTECTED ) ) ) 194 { 195 return false; 196 } 197 else 198 { 199 return Arrays.equals( m_private, classpath.getDependencies( Category.PRIVATE ) ); 200 } 201 } 202 else 203 { 204 return false; 205 } 206 } 207 208 /** 209 * Return the hashcode for the plugin definition. 210 * @return the hash code 211 */ 212 public int hashCode() 213 { 214 int hash = hashArray( m_system ); 215 hash ^= hashArray( m_public ); 216 hash ^= hashArray( m_protected ); 217 hash ^= hashArray( m_private ); 218 return hash; 219 } 220 221 /** 222 * Return the classpath as a string. 223 * @return the string value 224 */ 225 public String toString() 226 { 227 return "classpath: [" 228 + m_system.length 229 + ", " + m_public.length 230 + ", " + m_protected.length 231 + ", " + m_private.length 232 + "]"; 233 } 234 235 private static final URI[] EMPTY_URIS = new URI[0]; 236 237 }